package br.com.zonavibe.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.zonavibe.connect.Conexao;
import br.com.zonavibe.dao.AlunoDAO;
import br.com.zonavibe.model.Aluno;

public class AlunoDAOImpl implements AlunoDAO {

	private Conexao conexao = new Conexao();
	private PreparedStatement ps = null;

	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#inserirAluno(br.com.zonavibe.model.Aluno)
	 */
	public boolean inserirAluno(Aluno aluno) throws SQLException {
		boolean retorno = false;
		try {
			String sql = "insert into aluno "
							+"(nm_aluno, endereco, tel_res, tel_cel, cep, estado, cidade, bairro, cpf, rg, data_nascimento, data_cadastro, email, id_categoria, nm_pai, nm_mae) " 
							+"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";

			ps = conexao.getConnection().prepareStatement(sql);

			ps.setString(1, aluno.getNome());
			ps.setString(2, aluno.getEndereco());
			ps.setString(3, aluno.getTelRes());
			ps.setString(4, aluno.getTelCel());
			ps.setString(5, aluno.getCep());
			ps.setInt(6, aluno.getEstado().getIdEstado());
			ps.setString(7, aluno.getCidade());
			ps.setString(8, aluno.getBairro());
			ps.setString(9, aluno.getCpf());
			ps.setString(10, aluno.getRg());
			ps.setDate(11, aluno.getDataNascimento());
			ps.setDate(12, aluno.getDataCadastro());
			ps.setString(13, aluno.getEmail());
			ps.setInt(14, aluno.getCategoria().getIdCategoria());
			ps.setString(15, aluno.getNmPai());
			ps.setString(16, aluno.getNmMae());

			int inseriu = ps.executeUpdate();

			if (inseriu == 0) {
				retorno = false;
			} else {
				retorno = true;
			}

			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#alterarAluno(br.com.zonavibe.model.Aluno)
	 */
	public boolean alterarAluno(Aluno aluno) throws SQLException {
		boolean retorno = false;

		try {
			String sql = "update aluno set nm_aluno = ?, endereco = ?, tel_res = ?, tel_cel = ?, cep = ?, estado = ?, cidade = ?, bairro = ?, cpf = ?, rg = ?, data_nascimento = ?, email = ?, nm_pai = ?, nm_mae = ?  where id_aluno = ?;";
			ps = conexao.getConnection().prepareStatement(sql);

			ps.setString(1, aluno.getNome());
			ps.setString(2, aluno.getEndereco());
			ps.setString(3, aluno.getTelRes());
			ps.setString(4, aluno.getTelCel());
			ps.setString(5, aluno.getCep());
			ps.setInt(6, aluno.getEstado().getIdEstado());
			ps.setString(7, aluno.getCidade());
			ps.setString(8, aluno.getBairro());
			ps.setString(9, aluno.getCpf());
			ps.setString(10, aluno.getRg());
			ps.setDate(11, aluno.getDataNascimento());
			ps.setString(12, aluno.getEmail());
			ps.setString(13, aluno.getNmPai());
			ps.setString(14, aluno.getNmMae());
			ps.setInt(15, aluno.getIdAluno());
			
			int alterou = ps.executeUpdate();

			if (alterou == 0) {
				retorno = false;
			} else {
				retorno = true;
			}

			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#deletarAluno(br.com.zonavibe.model.Aluno)
	 */
	public boolean deletarAluno(Aluno aluno) throws SQLException {
		boolean retorno = false;

		try {
			String sql = "delete from aluno where id_aluno = ?;";
			ps = conexao.getConnection().prepareStatement(sql);

			ps.setInt(1, aluno.getIdAluno());
			int deletou = ps.executeUpdate();

			if (deletou == 0) {
				retorno = false;
			} else {
				retorno = true;
			}

			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#listaAlunos()
	 */
	public List<Aluno> listaAlunos() throws SQLException {
		List<Aluno> lista = new ArrayList<Aluno>();

		try {
			String sql = "select * from aluno order by nm_aluno;";
			ps = conexao.getConnection().prepareStatement(sql);
			ResultSet rs = ps.executeQuery();

			Aluno aluno = null;
			EstadoDAOImpl estadoDAO = new EstadoDAOImpl();
			CategoriaDAOImpl categoriaDAO = new CategoriaDAOImpl();

			while (rs.next()) {
				aluno = new Aluno();

				aluno.setIdAluno(rs.getInt("id_aluno"));
				aluno.setNome(rs.getString("nm_aluno"));
				aluno.setEndereco(rs.getString("endereco"));
				aluno.setTelRes(rs.getString("tel_res"));
				aluno.setTelCel(rs.getString("tel_cel"));
				aluno.setCep(rs.getString("cep"));

				int idEstado = rs.getInt("estado");
				aluno.setEstado(estadoDAO.buscarEstado(idEstado));

				aluno.setCidade(rs.getString("cidade"));
				aluno.setBairro(rs.getString("bairro"));
				aluno.setCpf(rs.getString("cpf"));
				aluno.setRg(rs.getString("rg"));
				aluno.setDataNascimento(rs.getDate("data_nascimento"));
				aluno.setDataCadastro(rs.getDate("data_cadastro"));
				aluno.setEmail(rs.getString("email"));
				aluno.setNmPai(rs.getString("nm_pai"));
				aluno.setNmMae(rs.getString("nm_mae"));

				int idCategoria = rs.getInt("id_categoria");
				aluno.setCategoria(categoriaDAO.buscarCategoria(idCategoria));

				lista.add(aluno);

			}

			rs.close();
			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return lista;
	}

	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#buscarAluno(br.com.zonavibe.model.Aluno)
	 */
	public Aluno buscarAluno(Aluno aluno) throws SQLException {
		Aluno alunoRetorno = null;

		try {
			String sql = "select * from aluno where cpf = ? or rg = ?";
			ps = conexao.getConnection().prepareStatement(sql);

			ps.setString(1, aluno.getCpf());
			ps.setString(2, aluno.getRg());

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				EstadoDAOImpl estadoDAO = new EstadoDAOImpl();
				CategoriaDAOImpl categoriaDAO = new CategoriaDAOImpl();

				alunoRetorno = new Aluno();

				alunoRetorno.setIdAluno(rs.getInt("id_aluno"));
				alunoRetorno.setNome(rs.getString("nm_aluno"));
				alunoRetorno.setEndereco(rs.getString("endereco"));
				alunoRetorno.setTelRes(rs.getString("tel_res"));
				alunoRetorno.setTelCel(rs.getString("tel_cel"));
				alunoRetorno.setCep(rs.getString("cep"));

				int idEstado = rs.getInt("estado");
				alunoRetorno.setEstado(estadoDAO.buscarEstado(idEstado));

				alunoRetorno.setCidade(rs.getString("cidade"));
				alunoRetorno.setBairro(rs.getString("bairro"));
				alunoRetorno.setCpf(rs.getString("cpf"));
				alunoRetorno.setRg(rs.getString("rg"));
				alunoRetorno.setDataNascimento(rs.getDate("data_nascimento"));
				alunoRetorno.setDataCadastro(rs.getDate("data_cadastro"));
				alunoRetorno.setEmail(rs.getString("email"));
				alunoRetorno.setNmPai(rs.getString("nm_pai"));
				alunoRetorno.setNmMae(rs.getString("nm_mae"));

				int idCategoria = rs.getInt("id_categoria");
				alunoRetorno.setCategoria(categoriaDAO.buscarCategoria(idCategoria));

			} else {
				rs.close();
			}

			rs.close();
			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return alunoRetorno;
	}
	
	/* (non-Javadoc)
	 * @see br.com.zonavibe.dao.AlunoDAO#buscarAlunos(br.com.zonavibe.model.Aluno)
	 */
	public List<Aluno> buscarAlunos(Aluno aluno) throws SQLException {
		List<Aluno> retorno = null;
		
		try {
			String sql = "select * from aluno where nm_aluno like ? or cpf = ? or rg = ?";
			ps = conexao.getConnection().prepareStatement(sql);
			
			String nome = "%"+aluno.getNome()+"%";
			
			ps.setString(1, nome);
			ps.setString(2, aluno.getCpf());
			ps.setString(3, aluno.getRg());
			
			ResultSet rs = ps.executeQuery();
			
			Aluno alunoAux = null;
			
			
			while (rs.next()) {
				EstadoDAOImpl estadoDAO = new EstadoDAOImpl();
				CategoriaDAOImpl categoriaDAO = new CategoriaDAOImpl();
				
				retorno = new ArrayList<Aluno>();
				alunoAux = new Aluno();
				
				alunoAux.setIdAluno(rs.getInt("id_aluno"));
				alunoAux.setNome(rs.getString("nm_aluno"));
				alunoAux.setEndereco(rs.getString("endereco"));
				alunoAux.setTelRes(rs.getString("tel_res"));
				alunoAux.setTelCel(rs.getString("tel_cel"));
				alunoAux.setCep(rs.getString("cep"));
				
				int idEstado = rs.getInt("estado");
				alunoAux.setEstado(estadoDAO.buscarEstado(idEstado));
				
				alunoAux.setCidade(rs.getString("cidade"));
				alunoAux.setBairro(rs.getString("bairro"));
				alunoAux.setCpf(rs.getString("cpf"));
				alunoAux.setRg(rs.getString("rg"));
				alunoAux.setDataNascimento(rs.getDate("data_nascimento"));
				alunoAux.setDataCadastro(rs.getDate("data_cadastro"));
				alunoAux.setEmail(rs.getString("email"));
				alunoAux.setNmPai(rs.getString("nm_pai"));
				alunoAux.setNmMae(rs.getString("nm_mae"));
				
				int idCategoria = rs.getInt("id_categoria");
				alunoAux.setCategoria(categoriaDAO.buscarCategoria(idCategoria));
				
				retorno.add(alunoAux);
			}
			
			rs.close();
			ps.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		return retorno;
	}

}
